<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/3/11 0011
 * Time: 21:29
 */

//System V的共享内存使用：
$key = 12345; // 共享内存的key
$memsize = 100; // 共享内存的大小，单位byte
$perm = 0666; // 共享内存访问权限，参考linux的权限
$var_key = 345; // 共享内存的某变量的key
$shmid = shm_attach( $key, $memsize, $perm ); // 创建一个共享内存
shm_put_var( $shmid, $var_key, "abc" ); // 插入一个共享内存变量，key为$var_key，值为"abc"
shm_detach( $shmid ); // 关闭共享内存

$shmid = shm_attach( 12345 ); // 访问key为12345的共享内存
echo shm_get_var( $shmid, 345 ); // 把共享内存中key为345的变量打印出来，这里将显示abc
shm_remove( $shmid ); // 删除该共享内存






exit();


//内存共享 PHP sysvshm提供了一个内存共享方案:sysvshm，它是和sysvsem,sysvmsg一个系列的
//1.这里使用的shmop系列函数  结合TIcks
//获取共享内存块的大小 shmop_size()
//从共享内存块读取数据 shmop_read()
//用于获取共享内存块的大小(以字节为单位shmop_size()
//将数据写入共享内存块 shmop_write()
//删除共享内存块 shmop_delete()
//关闭共享内存块 shmop_close()
//返回当前分配给你的 PHP 脚本的内存量，单位是字节（byte）。 memory_get_usage()
function memoryUsage()
{
    printf("%s: %s<br/>", date("H:i:s"), memory_get_usage());
    //var_dump(debug_backtrace());
    //var_dump(__FUNCTION__);
    //debug_print_backtrace();
}

register_tick_function("memoryUsage");
declare(ticks=1){
    $shm_key = ftok(__FILE__, 's');
    //共享内存块的系统ID。可以作为十进制或十六进制传递。

    //“a”表示访问(设置SHM_RDONLY表示Shmat)，当您需要打开现有的共享内存段以进行只读时，请使用此标志
    //c”用于CREATE(设置IPC_CREATE)，当您需要创建一个新的共享内存段时，或者如果存在相同键的段，请尝试打开它以进行读写。
    //“w”用于读写访问时使用此标志，当您需要对共享内存段进行读写时，在大多数情况下使用此标志。
    //n”创建一个新的内存段(设置IPC_CREATEINECTIPC_EXST)，当您想要创建一个新的共享内存段时使用此标志，但是如果一个内存段已经存在，则失败。这对于安全目的很有用，使用它您可以防止竞争条件的利用。

    //要分配给内存段的权限，与文件的权限相同。权限需要以八进制形式传递
    $shm_id = shmop_open($shm_key, 'c', 0644, 100);
}
//printf("共享内存块的大小: %s<br/>", shmop_size($shm_id));
//创建的共享内存块标识符
//用于开始阅读的偏移量
//要读取的字节数。0读shmop_size($shmid) - $start字节。
$shm_text = shmop_read($shm_id, 0, 100); //返回数据或者在失败时返回FALSE.
//eval() 函数把字符串按照 PHP 代码来计算。
//echo $shm_text;
//eval("\$share_array =\"$shm_text\";");
eval($shm_text);
echo $share;
if (!empty($share)) {
//    var_dump($share_array);
//    $share_array['id'] += 1;
    @$share += 1;

} else {
//    $share_array = array('id' => 1);
    $share = 1;
}

//$out_put_str = "$share_array = " . var_export($share_array, true) .";";  //var_export 如果设置为 TRUE，该函数不会执行输出结果，而且将输出结果返回给一个变量。
//$out_put_str = "var_export($share_array, true)";
//$out_put_str = "\$share_array = \"var_export($share_array, true)\";";
$out_put_str = "\$share = \" $share \";";

//$out_put_str = str_pad($out_put_str, 100, " ", STR_PAD_RIGHT);
//创建的共享内存块标识符
//要写入共享内存块的字符串
//指定在共享内存段中开始写入数据的位置
shmop_write($shm_id, $out_put_str, 0);//书写的大小data，或FALSE在失败的时候
shmop_delete($shm_id);
//$string = "beautiful";
//$time = "winter";
//
//$str = 'This is a $string $time morning!';
//echo $str. "<br />";
//
//eval("\$str = \"$str\";");
//echo $str;


